/*
* Filename
: filexm.h
* copyright
: (C) by 张鸿烈
* Function
: 获取的文件管理信息,检测文件读写操作。
*/
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#define BSZ 16
//判断文件类型
void File_Type(mode_t mode){
//显示文件类型
printf("File Type:\t");
//链接文件
if(S_ISLNK(mode)) printf("Symbolic Linke\n");
//普通文件
else if(S_ISREG(mode)) printf("Regular\n");
//目录文件
else if(S_ISDIR(mode)) printf("Directoy\n");
//字符设备
else if(S_ISCHR(mode)) printf("Character Device\n");
//块设备
else if(S_ISBLK(mode)) printf("Block Device\n");
//管道文件
else if(S_ISFIFO(mode)) printf("FIFO\n");
//套接口
else if(S_ISSOCK(mode)) printf("Socket\n");
//不可识别的设备
else printf("Unkown type\n");
}
//显示文件控制信息
void File_State(char * fn)
{
struct stat buf; //保存打开文件信息的缓冲区
int fd ;
//打开文件
if((fd = open(fn,O_RDONLY)) < 0){
perror(fn);
exit(EXIT_FAILURE);
}
//是否能读出该文件的控制信息
if((fstat(fd,&buf)) < 0){
perror(fn);
exit(EXIT_FAILURE);
}
//读出写后的文件的控制信息,显示文件控制信息
//显示节点号
printf("========%s state========\n",fn);
printf("File INODE:\t%ld\n",buf.st_ino);
//显示设备号
printf("File DEVICE:\t%d,%d\n",major(buf.st_dev),minor(buf.st_dev));
//显示保护方式
printf("File MODE:\t%#o\n",buf.st_mode & ~(S_IFMT));
//显示连接数
printf("File LINKS:\t%d\n",buf.st_nlink);
//显示用户 ID
printf("File UID:\t%d\n",buf.st_uid);
//显示组 ID
printf("File GID:\t%d\n",buf.st_gid);
//分析并显示文件的类型
File_Type(buf.st_mode);
//显示文件长度
printf("File SIZE:\t%ld\n",buf.st_size);
//显示文件系统 I/O 块长度
printf("File BLK SIZE:\t%ld\n",buf.st_blksize);
//显示已分配 I/O 块长度
printf("File BLOCK:\t%ld\n",buf.st_blocks);
//显示最后访问文件的时间
printf("File ACCESSED:\t%s",ctime(&buf.st_atime));
//显示最后修改文件的时间
printf("File MODIFIED:\t%s",ctime(&buf.st_mtime));
//显示最后改变文件的时间
printf("File CHANGED:\t%s",ctime(&buf.st_ctime));
}

